#!/usr/bin/env Rscript

# run_all.R
# 运行完整的Seurat分析流程
# 依次执行: 01_qc_preprocessing → 02_clustering_dim_reduction → 03_annotation_differential_expression

cat("========================================\n")
cat("Seurat单细胞分析完整流程\n")
cat("========================================\n")

# 检查必要的目录
required_dirs <- c("output", "figures")
for (dir in required_dirs) {
  if (!dir.exists(dir)) {
    cat("创建目录:", dir, "\n")
    dir.create(dir, recursive = TRUE)
  }
}

# 检查输入文件是否存在
if (!file.exists("01_qc_preprocessing.R")) {
  stop("错误: 找不到01_qc_preprocessing.R文件")
}

# 记录开始时间
start_time <- Sys.time()
cat("分析开始时间:", as.character(start_time), "\n\n")

# 第一步: QC和预处理
cat("第一步: 执行QC和预处理...\n")
cat("----------------------------------------\n")
source("01_qc_preprocessing.R")
cat("----------------------------------------\n")
cat("第一步完成\n\n")

# 检查第一步输出
if (!file.exists("output/seurat_obj_qc.rds")) {
  stop("错误: QC步骤未成功生成输出文件")
}

# 第二步: 聚类和降维
cat("第二步: 执行聚类和降维...\n")
cat("----------------------------------------\n")
source("02_clustering_dim_reduction.R")
cat("----------------------------------------\n")
cat("第二步完成\n\n")

# 检查第二步输出
if (!file.exists("output/seurat_obj_clustered.rds")) {
  stop("错误: 聚类步骤未成功生成输出文件")
}

# 第三步: 注释和差异表达
cat("第三步: 执行细胞注释和差异表达分析...\n")
cat("----------------------------------------\n")
source("03_annotation_differential_expression.R")
cat("----------------------------------------\n")
cat("第三步完成\n\n")

# 记录结束时间
end_time <- Sys.time()
duration <- end_time - start_time

cat("========================================\n")
cat("    分析完成!\n")
cat("========================================\n")
cat("开始时间:", as.character(start_time), "\n")
cat("结束时间:", as.character(end_time), "\n")
cat("总耗时:", round(duration, 2), " ", units(duration), "\n\n")

# 生成最终报告
cat("生成的分析文件:\n")
cat("----------------------------------------\n")

output_files <- list.files("output", recursive = TRUE, full.names = FALSE)
for (file in output_files) {
  file_path <- file.path("output", file)
  file_size <- file.size(file_path)
  cat("- ", file, " (", round(file_size/1024, 1), " KB)\n", sep = "")
}

cat("\n主要输出文件说明:\n")
cat("----------------------------------------\n")
cat("seurat_obj_qc.rds        - QC后的Seurat对象\n")
cat("seurat_obj_clustered.rds - 聚类后的Seurat对象\n")
cat("seurat_obj_annotated.rds - 注释后的Seurat对象\n")
cat("qc_metrics.png           - QC指标可视化\n")
cat("umap_clusters.png        - UMAP聚类图\n")
cat("annotated_umap.png       - 注释后的UMAP图\n")
cat("all_cluster_markers.csv  - 所有聚类标记基因\n")
cat("cell_type_statistics.csv - 细胞类型统计\n")

cat("\n下一步建议:\n")
cat("----------------------------------------\n")
cat("1. 检查output/目录下的所有可视化结果\n")
cat("2. 查看标记基因文件确定细胞注释是否合理\n")
cat("3. 根据需要调整聚类分辨率或注释方案\n")
cat("4. 进行更深入的生物学分析\n")

# 保存会话信息
cat("\n保存会话信息...\n")
sink("output/session_info.txt")
print(sessionInfo())
sink()

cat("会话信息已保存至: output/session_info.txt\n")